<?php
include_once "funcoes.php";

class Retorno{
    
    private $arquivo;
    private $identificacao;
    private $bancoNum;
    private $banco;
    private $agencia;
    private $conta;
    private $contaDv;
    private $convenio;
    private $tipo;
    
    private $linhas;
    private $registros;
    
    public function __construct($arq) {
        $this->arquivo = $arq;
        
        $this->ReadFile();
        $this->Cabecalho();
        
        switch ($this->tipo){
            case "ITAÚ": $this->Itau(); break;
            case "CBR64": $this->CBR64(); break;
            case "CBR724": $this->CBR724(); break;
            case "IEDCBR": $this->IEDCBR(); break;
            case "SIGCB": $this->SIGCB(); break;
        }

        
        /*
        echo $this->identificacao." ".$this->bancoNum." ".$this->banco." ".$this->agencia." ".$this->conta." ".$this->contaDv." ".count($this->linhas)." ".$this->tipo;
        echo "<br><br>";
        */
        for($i = 0; $i < count($this->registros) -1; $i++){
            echo "Nosso número: ".$this->registros[$i]["nosso_numero"]." ".
                " Data do pagamento: ".$this->registros[$i]["data_pagamento"]." ".
                " Data de vencimento: ".$this->registros[$i]["data_vencimento"]." ".
                " Taxa do boleto: ".$this->registros[$i]["taxa_documento"]." ".
                " Valor do documento: ".$this->registros[$i]["valor_documento"]." ".
                " Valor pago: ".$this->registros[$i]["valor_pago"]."<br>";
        }
		
    }
    
    // GETS
    public function GetRegistros(){
        return $this->registros;
    }
	
	public function GetTipo(){
        return $this->tipo;
    }
    
    // SETS
    private function SetIdentificacao($val){
        if(ValidaNomeNum($val) && strlen($val) == 19){
            $this->identificacao = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetBancoNum($val){
        if(ValidaNumero($val) && strlen($val) == 3){
            $this->bancoNum = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetBancoNome($val){
        if(ValidaNome($val) && strlen($val) == 15){
            $this->banco = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetAgencia($val, $tam){
        if(ValidaNumero($val) && strlen($val) == $tam){
            $this->agencia = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetConta($val, $tam){
        if(ValidaNumero($val) && strlen($val) == $tam){
            $this->conta = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetContaDv($val){
        if(ValidaNumero($val) && strlen($val) == 1){
            $this->contaDv = $val;
            return 1;
        }else{
            return 0;
        }
    }
    private function SetConvenio($val, $tam){
        if(ValidaNumero($val) && strlen($val) == $tam){
            $this->convenio = $val;
            return 1;
        }else{
            return 0;
        }
    }
    
    
    
    // LÊ O ARQUIVO
    private function ReadFile(){
        $vetor = NULL;
        $processa = true;
        
        while ($processa){
            $file = fopen($this->arquivo, "r");
            while ($line = fgets ($file, 1024)){
                $vetor[] = $line;
            }
            fclose($file);
            
            if(count($this->linhas) >= count($vetor)){
                $processa = false;
            }else{
                $this->linhas = NULL;
                for($i = 0; $i < count($vetor); $i++){
                    $this->linhas[$i] = $vetor[$i];
                }
                unset($vetor);
                $vetor = NULL;
            }
        }
        
        return true;
    }
    
    
    // RESETA CAMPOS
    private function Reset(){
        unset($this->identificacao);
        unset($this->bancoNum);
        unset($this->banco);
        unset($this->agencia);
        unset($this->conta);
        unset($this->contaDv);
        unset($this->convenio);
        unset($this->tipo);
    }






    // CARREGA VALORES DO CABEÇALHO
    private function Cabecalho(){
        $ok = 0;
        $line = $this->linhas[0];
        
        // ITAÚ
        $ok += $this->SetIdentificacao(substr($line, 0, 19));
        $ok += $this->SetAgencia(substr($line, 25, 5), 5);
        $ok += $this->SetConta(substr($line, 30, 7), 7);
        $ok += $this->SetContaDv(substr($line, 37, 1));
        $ok += $this->SetBancoNum(substr($line, 76, 3));
        $ok += $this->SetBancoNome(substr($line, 79, 15));
        
        $this->tipo = "ITAÚ";
        
        if($ok != 6 || $this->bancoNum != "341"){
            $ok = 0;
            $this->Reset();
            
            // CBR64
            $ok += $this->SetIdentificacao(substr($line, 0, 19));
            $ok += $this->SetAgencia(substr($line, 26, 4), 4);
            $ok += $this->SetConta(substr($line, 34, 5), 5);
            $ok += $this->SetContaDv(substr($line, 39, 1));
            $ok += $this->SetBancoNum(substr($line, 76, 3));
            $ok += $this->SetBancoNome(substr($line, 79, 15));
            
            if($ok == 6){
                $this->tipo = "CBR64";
            }
            
            if($ok != 6 || $this->bancoNum != "001"){
                $ok = 0;
                $this->Reset();
                
                // CBR724
                $ok += $this->SetAgencia(substr($line, 12, 4), 4);
                $ok += $this->SetConta(substr($line, 20, 5), 5);
                $ok += $this->SetConvenio(substr($line, 25, 7), 7);
                
                if($ok == 3){
                    $this->tipo = "CBR724";
                }
                
                if($ok != 3 || strlen($this->convenio) != 7){
                    $ok = 0;
                    $this->Reset();
                    
                    // IEDCBR
                    $ok += $this->SetBancoNum(substr($line, 0, 3));
                    $ok += $this->SetConvenio(substr($line, 33, 7), 7);
                    $ok += $this->SetAgencia(substr($line, 53, 4), 4);
                    $ok += $this->SetConta(substr($line, 65, 5), 5);
                    $ok += $this->SetContaDv(substr($line, 70, 1));
                    $ok += $this->SetBancoNome(substr($line, 102, 15));
                    
                    if($ok == 6){
                        $this->tipo = "IEDCBR";
                    }
                    
                    if($ok != 6 || $this->bancoNum != "001"){
                        $ok = 0;
                        $this->Reset();
						
                        // SIGCB
                        $ok += $this->SetBancoNum(substr($line, 0, 3));
                        $ok += $this->SetAgencia(substr($line, 53, 4), 4);
                        $ok += $this->SetConvenio(substr($line, 58, 5), 5);
                        $ok += $this->SetBancoNome(substr($line, 102, 18));
                        
                        //$ok += $this->SetConta(substr($line, 65, 5), 5);
                        //$ok += $this->SetContaDv(substr($line, 70, 1));
                        
                        if($ok == 4){
                            $this->tipo = "SIGCB";
                        }
                    }
                }
            }
        }
        
        return true;
    }
    
    
    
    // PROCESSA AS LINHAS
    private function Itau(){
        for($i = 1; $i < count($this->linhas); $i++){
            $this->registros[($i-1)]["nosso_numero"]    = RemoveZeros(substr($this->linhas[$i], 62, 8));
            $this->registros[($i-1)]["data_pagamento"]  = CorrigeData(substr($this->linhas[$i], 110, 6));
            $this->registros[($i-1)]["valor_documento"] = QuebraValor(substr($this->linhas[$i], 157, 8));
            $this->registros[($i-1)]["valor_pago"]      = QuebraValor(substr($this->linhas[$i], 258, 8));
        }
    }
    
    private function CBR64(){
        for($i = 1; $i < count($this->linhas); $i++){
            $this->registros[($i-1)]["nosso_numero"]    = RemoveZeros(substr($this->linhas[$i], 74, 6));
            $this->registros[($i-1)]["data_pagamento"]  = CorrigeData(substr($this->linhas[$i], 110, 6));
            $this->registros[($i-1)]["valor_documento"] = QuebraValor(substr($this->linhas[$i], 158, 7));
            $this->registros[($i-1)]["valor_pago"]      = QuebraValor(substr($this->linhas[$i], 311, 7));
        }
    }
    
    private function CBR724(){
        for($i = 9; $i < (count($this->linhas)-4); $i++){
            $this->registros[($i-9)]["nosso_numero"]    = RemoveZeros(substr($this->linhas[$i], 14, 5));
            $this->registros[($i-9)]["taxa_documento"]  = QuebraValor(substr($this->linhas[$i], 131, 4));
            $this->registros[($i-9)]["valor_documento"] = QuebraValor(substr($this->linhas[$i], 99, 7));
            $this->registros[($i-9)]["valor_pago"]      = QuebraValor(substr($this->linhas[$i], 144, 7));
        }
    }
    
    private function IEDCBR(){
        $c = 0;
        for($i = 2; $i < (count($this->linhas)-4); $i++){
            if(($i%2) == 0){
                $this->registros[$c]["nosso_numero"]    = RemoveZeros(substr($this->linhas[$i], 48, 5));
                $this->registros[$c]["valor_documento"] = QuebraValor(substr($this->linhas[$i], 89, 7));
            }else{
                $this->registros[$c]["valor_pago"]      = QuebraValor(substr($this->linhas[$i], 100, 7));
                $this->registros[$c]["data_pagamento"]  = CorrigeData(substr($this->linhas[$i], 137, 8));
                $this->registros[$c]["data_vencimento"] = CorrigeData(substr($this->linhas[$i], 145, 8));
            }
            
            if(substr($this->linhas[$i], 13, 1) == "U"){
                $c++;
            }
        }
    }
    
    private function SIGCB(){
        $c = 0;
        for($i = 2; $i < (count($this->linhas)-4); $i++){
            if(($i%2) == 0){
                $this->registros[$c]["nosso_numero"]    = RemoveZeros(substr($this->linhas[$i], 50, 6));
                $this->registros[$c]["data_vencimento"] = CorrigeData(substr($this->linhas[$i], 73, 8));
                $this->registros[$c]["valor_documento"] = QuebraValor(substr($this->linhas[$i], 89, 7));
            }else{
                $this->registros[$c]["valor_pago"]      = QuebraValor(substr($this->linhas[$i], 85, 7));
                $this->registros[$c]["data_pagamento"]  = CorrigeData(substr($this->linhas[$i], 85, 8));
            }
            
            if(substr($this->linhas[$i], 13, 1) == "U"){
                $c++;
            }
        }
    }
}
